package com.foxire.polymorphsm2;

public class Test {
    public static void main(String[] args) {
        // 目标：认识多态的代码
        // 1.多态的好处：代码的灵活度更高，代码的复用性更高，右边对象是解耦合的。
        Animal a = new Tortoise();
        a.run();
        //a.shrinkHead();// 报错，多态下不能调用子类独有功能。

        // 强制类型转换：
        Tortoise t1 = (Tortoise) a;
        t1.shrinkHead();
        // 有继承关系就可以强制转换，编译阶段不会报错!
        // 运行时可能会出现类型转换异常:ClassCastException
        //Wolf w1 = (Wolf) a;


        System.out.println("--------------------------------");

        Wolf w = new Wolf();
        go(w);
        w.eat();

        Tortoise t = new Tortoise();
        go(t);
        t.shrinkHead();

    }

    public static void go(Animal a)
    //2、多态的好处2:父类类型的变量作为参数，可以接收一个子类对象
    {
        System.out.println("go");
        a.run();

        if(a instanceof Wolf){
            Wolf w1 = (Wolf) a;
            w1.eat();
        }else if(a instanceof Tortoise){
            Tortoise t2 = (Tortoise) a;
            t2.shrinkHead();
        }
    }
}
